import cv2
import numpy as np
import time
import HandTrackingModule as htm
import math
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
from comtypes import CLSCTX_ALL

wCam, hCam = 640, 480
cap = cv2.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)
pTime = 0
volBar = 400
vol = 0
minVol, maxVol = 0.0 , 100.0

handDetector = htm.handDetector(detectionCon = 0.7)

# 获取默认的音频播放设备（扬声器）
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)

# 获取音量控制接口
volume = interface.QueryInterface(IAudioEndpointVolume)

# 获取当前音量
# current_volume = volume.GetMasterVolumeLevelScalar()  # 返回 0.0 ~ 1.0
# print(f"- Volume scalar: {current_volume * 100:.0f}%")



while True:
    success, img = cap.read()
    if success:
        img = handDetector.findHands(img)
        lmList = handDetector.findPosition(img,draw = False)
        if len(lmList) != 0:
            # print(lmList[4],lmList[8])
            x1, y1 = lmList[4][1], lmList[4][2]
            x2, y2 = lmList[8][1], lmList[8][2]
            cx, cy = (x1+x2)//2, (y1+y2)//2

            cv2.circle(img, (x1, y1), 15, (255, 0, 255), cv2.FILLED)
            cv2.circle(img, (x2, y2), 15, (255, 0, 255), cv2.FILLED)
            cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255), 3)
            # cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)

            length = math.hypot(x2-x1, y2-y1)
            # print(length)

            # Hand Range 20 - 300
            # Volume Range 0.0 - 100.0
            vol = np.interp(length, [20, 300], [minVol, maxVol])
            volBar = np.interp(length, [20, 300], [400, 150])
            # 设置音量百分比
            volume.SetMasterVolumeLevelScalar(int(vol)*0.01, None)
            # print(vol)
            if length < 50:
                cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)

        cv2.rectangle(img, (50, 150), (85, 400), (255, 0, 255), 2)
        cv2.rectangle(img, (50, int(volBar)), (85, 400), (255, 0, 255), -1)
        cv2.putText(img, f"{int(vol)}%", (40, 130), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 2)
        cTime = time.time()
        fps = 1/(cTime-pTime)
        pTime = cTime
        cv2.putText(img, f"FPS : {int(fps)}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
        cv2.imshow('img', img)
        if cv2.waitKey(1) == ord('q'):
            break
volume.SetMasterVolumeLevelScalar(0.2, None)
